AsyncTask ব্যবহার করে Background Tasks পরিচালনা
Android অ্যাপ্লিকেশনে AsyncTask ব্যবহার করে ব্যাকগ্রাউন্ড টাস্ক সম্পন্ন করা যায়, যেমন নেটওয়ার্ক অপারেশন, ডাটাবেস অ্যাক্সেস, বা অন্যান্য লম্বা সময় ধরে চলা কাজ। AsyncTask মূলত ব্যাকগ্রাউন্ডে কাজ করে এবং কাজ শেষ হলে UI থ্রেডে রেজাল্ট আপডেট করে, যাতে অ্যাপ্লিকেশনটি রেসপন্সিভ থাকে এবং UI ব্লক না হয়।
AsyncTask এর মূল Components
AsyncTask ক্লাসটি তিনটি প্রধান জেনেরিক প্যারামিটার গ্রহণ করে:
- Params: ইনপুট প্যারামিটার, যা ব্যাকগ্রাউন্ড টাস্কে প্রেরণ করা হয়।
- Progress: ব্যাকগ্রাউন্ডে চলা টাস্কের স্ট্যাটাস (প্রগ্রেস আপডেটের জন্য)।
- Result: কাজের রেজাল্ট, যা কাজ শেষ হলে UI থ্রেডে পাঠানো হয়।
AsyncTask এ চারটি গুরুত্বপূর্ণ মেথড রয়েছে:
- onPreExecute(): ব্যাকগ্রাউন্ড টাস্ক শুরু হওয়ার আগে UI থ্রেডে কল হয়।
- doInBackground(Params...): ব্যাকগ্রাউন্ডে কাজ সম্পন্ন করে (এই মেথডটি মেইন থ্রেডে কাজ করে না)।
- onProgressUpdate(Progress...): প্রগ্রেস আপডেট করতে UI থ্রেডে কল হয়।
- onPostExecute(Result): ব্যাকগ্রাউন্ড কাজ শেষ হওয়ার পর UI থ্রেডে কল হয় এবং রেজাল্ট প্রসেস করে।
AsyncTask এর উদাহরণ
নিচে একটি AsyncTask এর উদাহরণ দেওয়া হলো, যেখানে ব্যাকগ্রাউন্ডে কিছু ডেটা ফেচ করা হচ্ছে এবং কাজ শেষে UI আপডেট করা হচ্ছে।
MainActivity.java:
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private TextView statusText;
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
statusText = findViewById(R.id.statusText);
progressBar = findViewById(R.id.progressBar);
// AsyncTask শুরু করা
new ExampleAsyncTask().execute(10); // এখানে ইনপুট প্যারামিটার হিসেবে ১০ পাঠানো হয়েছে
}
private class ExampleAsyncTask extends AsyncTask<Integer, Integer, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// কাজ শুরু হওয়ার আগে UI আপডেট করা
statusText.setText("Task Started...");
progressBar.setProgress(0);
}
@Override
protected String doInBackground(Integer... params) {
int maxCount = params[0]; // ইনপুট প্যারামিটার প্রাপ্তি
for (int i = 1; i <= maxCount; i++) {
try {
Thread.sleep(1000); // ১ সেকেন্ড ধরে কাজ করছে (সিমুলেশন)
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress((i * 100) / maxCount); // প্রগ্রেস আপডেট পাঠানো
}
return "Task Completed!";
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
// প্রগ্রেস আপডেট করা
int progress = values[0];
progressBar.setProgress(progress);
statusText.setText("Progress: " + progress + "%");
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// কাজ শেষ হওয়ার পর UI আপডেট করা
statusText.setText(result);
}
}
}
Layout (activity_main.xml):
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/statusText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Status"
android:textSize="18sp"/>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="0"
android:indeterminate="false"/>
</LinearLayout>
কোডের ব্যাখ্যা:
- onPreExecute(): কাজ শুরু হওয়ার আগে UI থ্রেডে কল হয়। এখানে একটি প্রাথমিক স্ট্যাটাস এবং প্রগ্রেসবার সেট করা হয়েছে।
- doInBackground(): ইনপুট প্যারামিটার হিসেবে একটি ইন্টারেজার গ্রহণ করা হয়েছে, যা ব্যাকগ্রাউন্ডে প্রক্রিয়াকরণ করে।
publishProgress()মেথডের মাধ্যমে প্রগ্রেস আপডেট পাঠানো হয়েছে। - onProgressUpdate(): UI তে প্রগ্রেস আপডেট করা হয়েছে, যেমন প্রগ্রেসবার এবং টেক্সট ভিউ আপডেট করা।
- onPostExecute(): কাজ শেষ হওয়ার পর UI আপডেট করা হয়েছে এবং রেজাল্ট ডিসপ্লে করা হয়েছে।
AsyncTask ব্যবহার করার Best Practices
- ক্ষুদ্র কাজের জন্য AsyncTask ব্যবহার করা: AsyncTask শুধুমাত্র ক্ষুদ্র এবং দ্রুত সম্পন্ন করা যায় এমন কাজের জন্য ব্যবহার করা উচিত। বড় বা দীর্ঘমেয়াদি কাজের জন্য Executor বা WorkManager ব্যবহার করা ভালো।
- Context Leakage এড়ানো: AsyncTask ইনার ক্লাস হিসেবে ব্যবহার করার সময় এটি Activity বা Context এর উপর ডিপেন্ডেন্ট থাকে। Activity বা Context পরিবর্তন হলে মেমোরি লিক হতে পারে। এজন্য Static AsyncTask ব্যবহার করা ভালো।
- Lifecycle-aware না হওয়া: AsyncTask Android অ্যাপ্লিকেশনের লাইফসাইকেল ম্যানেজ করে না। তাই Activity ধ্বংস হয়ে গেলে AsyncTask চলতে থাকলে সমস্যা হতে পারে। এর পরিবর্তে Lifecycle-aware কম্পোনেন্ট (যেমন ViewModel, LiveData) ব্যবহার করা ভালো।
- Cancel করা: AsyncTask যখন আর প্রয়োজন নেই তখন
cancel(true)ব্যবহার করে এটি বাতিল করা উচিত।
উপসংহার
AsyncTask হল Android এ ব্যাকগ্রাউন্ড টাস্ক পরিচালনা করার জন্য একটি সহজ এবং কার্যকরী পদ্ধতি। ছোট এবং দ্রুত কাজের জন্য এটি ব্যবহার করা ভালো, কিন্তু বড় কাজের জন্য বা ব্যাকগ্রাউন্ড টাস্ক ব্যবস্থাপনার জন্য WorkManager বা Executors এর মতো আধুনিক পদ্ধতি ব্যবহার করা ভালো। AsyncTask এর সঠিক ব্যবহার অ্যাপ্লিকেশনকে আরও রেসপন্সিভ এবং ইন্টারঅ্যাকটিভ করে তোলে।
Read more